package response

import (
	"admin100/library/define"
	"admin100/library/define/defLang"

	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

// 数据返回通用JSON数据结构
type JsonResponse struct {
	Code    int         `json:"code"`    // 错误码((0:成功, 1:失败, >1:错误码))
	Message string      `json:"message"` // 提示信息
	Data    interface{} `json:"data"`    // 返回数据(业务接口定义具体数据结构)
}

/**
 * 标准返回结果， 返回define错误msg
 */
func json(r *ghttp.Request, code define.ErrorCodeType, data ...interface{}) {
	jsonWithMsg(r, code, define.GotMsg(code), data...)
}

/**
 * 成功标准返回结果， 返回define.ErrorCodeType错误msg
 */
func JsonFail(r *ghttp.Request, code ...define.ErrorCodeType) {
	if len(code) > 0 && code[0] > -1 {
		json(r, code[0])
	} else {
		json(r, define.Fail)
	}
}

/**
 * 成功标准返回结果， 返回define.Success成功msg
 */
func JsonSuc(r *ghttp.Request, data ...interface{}) {

	if len(data) > 0 && data[0] != nil {
		// rvd := reflect.ValueOf(data[0])
		json(r, define.Success, data[0])
		// if rvd.IsNil() {
		// 	json(r, define.Success)
		// } else {
		// 	json(r, define.Success, data[0])
		// }

	} else {
		json(r, define.Success)
	}
}

// 用于返回指定msg
func JsonExitWithMsg(r *ghttp.Request, code define.ErrorCodeType, message string, data ...interface{}) {
	jsonWithMsg(r, code, message, data...)
	r.Exit()
}

/**
 * 指定返回给用户的消息
 * @data 如果data为nil ,则默认返回前端 {}
 */
func jsonWithMsg(r *ghttp.Request, code define.ErrorCodeType, message string, data ...interface{}) {
	responseData := interface{}(nil)
	if len(data) > 0 {
		if g.IsNil(data[0]) {
			data[0] = map[string]interface{}{}
		}
		responseData = data[0]
	} else {
		responseData = []interface{}{}
	}

	var msg string = message
	if len(message) == 0 {
		msg = defLang.GotMsg(code)
	}

	r.Response.WriteJson(JsonResponse{
		Code:    int(code),
		Message: msg,
		Data:    responseData,
	})
	r.Exit()
}
